package com.czh.array;

import java.util.Arrays;

/**
 * 数组的常用操作
 *
 * @author chenzhihua
 * @Date 2024/2/19
 */
public class BaseOperateArray {
    public static void main(String[] args) {
        // 1. 数组的初始化操作
        int[] arr1 = new int[5]; // 默认全为0
        int[] arr2 = {0, 1, 2, 3, 4};
        // 2. 数组的取值: 通过下标取值
        int num1 = arr2[1];
        // 3. 数组的添加
        insertArray(arr2, 11, 2);
        display("添加后的数组", arr2);
        // 4. 数组的删除
        deleteArray(arr2, 2);
        display("删除后的数组", arr2);
        // 5. 数组的遍历
        traverseArray(arr2);
        // 6. 数组查找元素
        findArray(arr2, 11);
        findArray(arr2, 3);
        // 7. 数组的扩容
        extendArray(arr2, 10);
    }

    /**
     * @param arr   待插入的数组
     * @param num   需要插入的数字
     * @param index 插入的位置
     */
    private static void insertArray(int[] arr, int num, int index) {
        // 将待插入的位置后的所有元素后移
        for (int i = arr.length - 1; i > index; i--) {
            arr[i] = arr[i - 1];
        }
        arr[index] = num;
    }

    /**
     * 删除数组元素
     *
     * @param arr   原始的数组
     * @param index 要删除的下标
     */
    private static void deleteArray(int[] arr, int index) {
        // 待删除的元素后面的值前移
        for (int i = index; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
    }

    /**
     * 数组的遍历
     *
     * @param arr
     */
    private static void traverseArray(int[] arr) {
        // 基础for循环
        System.out.print("基础for循环: ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        System.out.print("增强for循环: ");
        // 增强for循环
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    /**
     * @param arr    原始数组
     * @param target 目标值
     * @return -1: 数组中不存在，其它: 元素所在小标
     */
    private static int findArray(int[] arr, int target) {
        for (int i = 0; i < arr.length; i++) {
            if (target == arr[i]) {
                System.out.println("找到了下标是:" + i);
                return i;
            }
        }
        System.out.println("未找到");
        return -1;
    }

    /**
     * 数组的长度扩展
     *
     * @param arr      原始数组
     * @param enLength 需要扩展的长度
     * @return
     */
    private static int[] extendArray(int[] arr, int enLength) {
        int[] newArray = new int[arr.length + enLength];
        for (int i = 0; i < arr.length; i++) {
            newArray[i] = arr[i];
        }
        display("扩展后的数组为: ", newArray);
        return newArray;
    }

    /**
     * 打印数组
     *
     * @param message 提示消息
     * @param arr     待打印的数组
     */
    private static void display(String message, int[] arr) {
        System.out.println(message + ": " + Arrays.toString(arr));
    }
}
